package Reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

class Son extends Person {

}

public class Demo1 {

	/**
	 * <pre>
	 * main(这里用一句话描述这个方法的作用)   
	 * 创建人：赵超 773134958@qq.com 
	 * 创建时间：2016-7-20 上午11:19:05    
	 * 修改人：赵超 773134958@qq.com   
	 * 修改时间：2016-7-20 上午11:19:05    
	 * 修改备注： 
	 * @param args
	 * </pre>
	 * 
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 */

	@SuppressWarnings({ "static-access", "rawtypes" })
	public static void main(String[] args) throws InstantiationException,
			IllegalAccessException, NoSuchFieldException, SecurityException {
		String name = Person.class.getName();
		System.out.println(name);
		String string = Person.class.toString();
		System.out.println(string);
		System.out.println("--getConstructors()方法查看该类中有什么public修饰的的构造方法--");
		Constructor[] constructors = Person.class.getConstructors();
		for (Constructor constructor : constructors) {
			System.out.println(constructor);
		}
		System.out.println("--getDeclaredConstructors()方法查看该类中所有的构造方法--");
		Constructor[] declaredConstructors = Person.class
				.getDeclaredConstructors();
		for (Constructor constructor1 : declaredConstructors) {
			System.out.println(constructor1);
		}
		System.out.println("--newInstance()方法创建该类中的对象--");
		Person newInstance = Person.class.newInstance();
		System.out.println(newInstance.toString());
		Class<? super Person> superclass = Person.class.getSuperclass();
		System.out.println(superclass);
		System.out.println("--getFields()方法获取该类中所有public修饰的对象--");
		Field[] fields = Son.class.getSuperclass().getFields();
		for (Field field : fields) {
			System.out.println(field);
		}
		System.out.println("--getField(\"name\")方法-获取public修饰的指定name的对象--");
		Field field = Person.class.getField("aa");
		System.out.println(field);
		System.out.println("---getDeclaredFields()方法获取该类中所有的对象---");
		Field[] declaredFields = Person.class.getDeclaredFields();
		for (Field field1 : declaredFields) {
			System.out.println(field1);
		}
		System.out.println("---getMethods()方法获取所有公共修饰的方法(包括父类)---");
		Method[] methods = Person.class.getMethods();
		for (Method method : methods) {
			System.out.println("方法名：" + method.getName());
			System.out.println(method);
		}
		System.out.println("----getDeclaredMethods()方法获取所有成员方法(不包括父类)----");
		Method[] declaredMethods = Person.class.getDeclaredMethods();
		for (Method method : declaredMethods) {
			System.out.println("方法名：" + method.getName());
			System.out.println(method);
		}
		System.out.println("---Field中的set()方法可以更改static修饰的对象的值---");
		Person.class.newInstance().show();
		Person.class.getField("aa").set(90, 100);
		Person.class.newInstance().show();
		System.out.println("---getPackage()方法获取该类所在的包名称---");
		System.out.println(Person.class.getPackage().getName());
		System.out.println("---getsuperclass()方法,子类反射出父类---");
		// 子类反射出父类，创建父类对象，调用父类的方法（举例：调用toString()方法）
		System.out.println(Person.class.getSuperclass().newInstance()
				.toString());
	}

}
